//
//  Problem917.swift
//  TestProject
//
//  Created by 武侠 on 2021/3/22.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 917. 仅仅反转字母
 给定一个字符串 S，返回 “反转后的” 字符串，其中不是字母的字符都保留在原地，而所有字母的位置发生反转。

 示例 1：
     输入："ab-cd"
     输出："dc-ba"
 示例 2：
     输入："a-bC-dEf-ghIj"
     输出："j-Ih-gfE-dCba"
 示例 3：
     输入："Test1ng-Leet=code-Q!"
     输出："Qedo1ct-eeLg=ntse-T!"
 提示：
     S.length <= 100
     33 <= S[i].ASCIIcode <= 122
     S 中不包含 \ or "
 */
@objcMembers class Problem917: NSObject {
    func solution() {
        print(reverseOnlyLettersZhan("ab-cd"))
        print(reverseOnlyLettersZhan("a-bC-dEf-ghIj"))
        print(reverseOnlyLettersZhan("Test1ng-Leet=code-Q!"))
    }
    
    /*
     双指针
     1: 创建左指针i，右指针j 双向遍历
     2: 遇到字母替换位置，其他字符不变
     */
    func reverseOnlyLetters(_ S: String) -> String {
        var charts = Array(S)
        var i = 0
        var j = charts.count - 1
        while i < j {
            if charts[i].isLetter == false {
                i += 1
                continue
            }
            if charts[j].isLetter == false {
                j -= 1
                continue
            }
            
            let tempc = charts[i]
            charts[i] = charts[j]
            charts[j] =  tempc
            
            i += 1
            j -= 1
        }
        
        return String(charts)
    }
    
    /*
     字母栈思路
     1: 创建一个字符栈：array
     2: 遍历字符串，遇到字母加入array中 ab-cd-s => abcds
     3: 那么从结尾处，就是反转的字符
     4: 遍历字符串，遇到字母，从栈中拿，遇到其他字符从字符串中拿
     */
    
    func reverseOnlyLettersZhan(_ S: String) -> String {
        var array: [Character] = [] // 字母栈
        for c in S {
            if c.isLetter {
                array.append(c)
            }
        }
        var i = 0
        var charts = Array(S)
        while i < charts.count {
            if charts[i].isLetter {
                charts[i] = array.removeLast()
            }
            i += 1
        }

        return String(charts)
    }
}
